package com.itkaien.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageInfo;
import com.itkaien.common.R;
import com.itkaien.pojo.Goods;
import com.itkaien.pojo.Inventory;
import com.itkaien.pojo.Ledger;
import com.itkaien.pojo.Message;
import com.itkaien.service.GoodsService;
import com.itkaien.service.InventoryService;
import com.itkaien.service.LedgerService;
import com.itkaien.service.MessageService;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

/**
 * 台账控制模块
 * 出库 入库
 * 流水操作
 *
 */
@RestController
@RequestMapping("/inventory")
public class InventoryServiceController {
    @Autowired
    private InventoryService inventoryService;
    @Autowired
    private GoodsService goodsService;

    @Autowired
    private LedgerService ledgerService;

    @Autowired
    private MessageService messageService;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    /**
     * 判断是否存在这个商品
     * 创建库存增加方法
     *
     * 1.判断这个商品是否之前有过入库
     *
     * 2.如果库存中有 就在原库存增加库存
     *
     * 3.如果没有库存就直接插入库存
     */
    @PostMapping("/increasestorynum")
    public R<Inventory> insertinventory(Inventory inventory){
        int flag=0;
        /**
         * 先查询是否有当前id的商品
         */
        Goods goods = goodsService.selectoneGood(inventory.getGoodsId());

        if (goods==null){
            /**
             * 插入商品不存在
             */
            return R.error("入库失败了");
        }
        /**
         * 先进性判断当前门店当前是否有 此时说明已经存在该商品的库存信息需要得到该信息 加上传过来的数据进行修改然后修改
         */
        Inventory findinventorybyid = inventoryService.findinventorybygoodsidandstoryid(inventory);
        if (findinventorybyid!=null){
            flag=1;
        }

        if (flag==1){
            Integer quantity = findinventorybyid.getQuantity();
            Integer quantity1=quantity;
            quantity=quantity+inventory.getQuantity();

            /**
             * 入库之后添加一条流水信息
             * 流水信息 分别有 流水 id 商品name（冗余字段） 商品id create_time  changenum改变的数量 storeid门店id
             */
            LocalDateTime localDateTime = LocalDateTime.now();
            Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
            Date date = Date.from(instant);
            Ledger ledger=new Ledger(goods.getId(),date,quantity1,inventory.getStoreId());
            ledgerService.addLedger(ledger);
            findinventorybyid.setQuantity(quantity);

            inventoryService.updateinventory(findinventorybyid);
            return R.success(inventory);
        }else if (flag==0){
            /**
             * 此时说明没有查询到数据库中有该库存
             */


            /**
             * 入库之后添加一条流水信息
             * 流水信息 分别有 流水 id 商品name（冗余字段） 商品id create_time  changenum改变的数量 storeid门店id
             */
            inventoryService.addinventory(inventory);
            LocalDateTime localDateTime = LocalDateTime.now();
            Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
            Date date = Date.from(instant);
            goods.setUpdateTime(date);
            Ledger ledger=new Ledger(goods.getId(),date,inventory.getQuantity(),inventory.getStoreId());
            ledgerService.addLedger(ledger);
            return R.success(inventory);
        }
        return R.error("入库失败了");
    }
    /**
     * 出库操作 根据门店的id以及商品的id先判断当前门店受否含有 以及是否数量足够出库  如果够出库的话再进行出库
     */
    @DeleteMapping("decreasestorynum")
    public R<Inventory> stockremoval(Inventory inventory) throws JsonProcessingException {
        Goods goods = goodsService.selectoneGood(inventory.getGoodsId());
        int flag=0;

        /**
         * 补充 在此之前还需要判断是否存在此类商品
         * 先进性判断当前门店当前是否有 此时说明已经存在该商品的库存信息需要得到该信息
         */
        Inventory findinventorybyid = null;
        findinventorybyid = inventoryService.findinventorybygoodsidandstoryid(inventory);
        if (findinventorybyid!=null){
            flag=1;
        }
        if (flag==1){
            Integer quantity = findinventorybyid.getQuantity();
            quantity=quantity-inventory.getQuantity();
            if (quantity>=0){
                findinventorybyid.setQuantity(quantity);
                inventoryService.updateinventory(findinventorybyid);
                /**
                 * 这里可以补一个当数据为0时也要删除记录 为0的数据没必要展示以及留存
                 */
                /**
                 * 出库数据也会增加一条流水
                 */
                LocalDateTime localDateTime = LocalDateTime.now();
                Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
                Date date = Date.from(instant);
                goods.setUpdateTime(date);
                /**
                 * 添加信息到流水表
                 */
                Ledger ledger=new Ledger(goods.getId(),date,-quantity,inventory.getStoreId());
                ledgerService.addLedger(ledger);

                /**
                 * 出库设置消息提醒 保存到数据库一份并且保存到redis一份设置超时提醒
                 */
                String content = "门店号："+inventory.getStoreId()+"商品号："+goods.getId();
                Message message=new Message("admin",date,"出库信息",content,0,null);
                messageService.saveMessage(message);

                /**
                 * 保存到redis中
                 */
                ObjectMapper objectMapper = new ObjectMapper();
                String jsonValue = objectMapper.writeValueAsString(message);
                long expireTime = 3 * 60 * 60; // 过期时间为 3 小时
                redisTemplate.opsForValue().set("message", jsonValue, expireTime, TimeUnit.SECONDS);

                findinventorybyid = inventoryService.findinventorybygoodsidandstoryid(inventory);
                return R.success(findinventorybyid);
            }else {
                findinventorybyid = inventoryService.findinventorybygoodsidandstoryid(inventory);
                return R.success(findinventorybyid);
            }
        }else{
            /**
             * 此时说明没有查询到数据库中有该库存
             */
            return R.success(findinventorybyid);
        }
    }
}
